import { ISet } from "./types";
import AVL from '@/sources/Tree/AVL/index'

/**
 * 集合
 */
export default class Set<T = number> implements ISet<T> {
    private avl: AVL<T>
    constructor() {
        this.avl = new AVL<T>();
    }
    /**
     * 获取数量
     */
    size() {
        return this.avl.size()
    }

    /**
     * 是否为空
     */
    isEmpty() {
        return this.size() === 0
    }

    /**
     * 清空集合
     */
    clear() {
        this.avl.clear();
    }   

    /**
     * 是否包含元素element
     * @param element 
     */
    contains(element: T) {
        return this.avl.contains(element)
    }   

    /**
     * 添加元素
     * @param element 
     */
    add(element: T) {
        this.avl.add(element)
    }

    /**
     * 删除元素
     * @param element 
     */
    remove(element: T) {
        this.avl.remove(element)
    } 

    /**
     * 遍历元素
     * @param cb 
     */
    forEach(cb: (ele: T) => void) {
        this.avl.inOrder(cb)
    }
    
    /**
     * 检验元素
     * @param element 
     */
    checkElement(element: T) {
        if (element == null) throw new Error('元素不合法~~')
    }
}